// 防抖函数
export const debounce = (func, wait, immediate) => {
  let timeout; // 定义一个计时器变量，用于延迟执行函数
  return function (...args) {
    // 返回一个包装后的函数
    const context = this; // 保存函数执行上下文对象
    const later = function () {
      // 定义延迟执行的函数
      timeout = null; // 清空计时器变量
      if (!immediate) func.apply(context, args); // 若非立即执行，则调用待防抖函数
    };
    const callNow = immediate && !timeout; // 是否立即调用函数的条件
    clearTimeout(timeout); // 清空计时器
    timeout = setTimeout(later, wait); // 创建新的计时器，延迟执行函数
    if (callNow) func.apply(context, args); // 如果满足立即调用条件，则立即执行函数
  };
};

// 节流函数
export const throttle = (func, wait) => {
  let timeout; // 定义一个计时器变量，用于限制函数调用频率
  return function (...args) {
    // 返回一个包装后的函数
    const context = this; // 保存函数执行上下文对象
    if (!timeout) {
      // 如果计时器不存在
      func.apply(context, args); // 执行函数
      timeout = setTimeout(() => {
        timeout = null; // 清空计时器变量
      }, wait); // 创建计时器，在指定时间后重置计时器变量
    }
  };
};

// 监听localStroage
export const dispatchEventStroage = () => {
  const signSetItem = localStorage.setItem;
  localStorage.setItem = function (key, val) {
    let setEvent = new Event("setItemEvent");
    setEvent.key = key;
    setEvent.newValue = val;
    window.dispatchEvent(setEvent);
    signSetItem.apply(this, arguments);
  };
};

/**
 * @description: 文件下载
 * @param {Blob} blob 参数1：blob对象
 * @param {string} name 参数2：文件名称，包含文件后缀
 * @return {*}
 */
export const download = (blob, name) => {
  const link = document.createElement("a"); //创建一个a标签
  const url = URL.createObjectURL(blob); //将blob文件对象通过URL.createObjectURL()方法转为为url
  link.href = url; //为a标签设置href属性，并赋值为url
  link.download = name; //定义下载的文件名，文件名要包含后缀哟！如'导出EXCEL.xlsx'
  document.body.appendChild(link); //把a标签放在body上
  link.click(); //出发a标签点击下载
  document.body.removeChild(link); //在body中移除这个a标签
  URL.revokeObjectURL(url); //释放blob对象
};
